#include <stdio.h>
#include <stdlib.h>

typedef struct LinkNode
{
    int data;
    LinkNode *next;
} SNode;

typedef struct Stack
{
    SNode *top;
    SNode *base;
    int length;
} LinkStack;

bool InitStack(LinkStack &S);    // 初始化
void DestoryStack(LinkStack &S); // 销毁
bool ClearStack(LinkStack &S);   // 清空
bool StackEmpty(LinkStack S);    // 判空
int StackLength(LinkStack S);    // 长度
bool GetTop(LinkStack S, int &e); // 栈顶
bool Push(LinkStack &S, int e);  // 压栈
bool Pop(LinkStack &S, int &e);   // 出栈
void Print(LinkStack S);         // 打印

// 初始化
bool InitStack(LinkStack &S)
{
    S.base = (SNode *)malloc(sizeof(SNode));
    if (S.base == NULL)
        return false;
    S.base->next = NULL;
    S.top = S.base;
    S.length = 0;
    return true;
}

// 销毁
void DestoryStack(LinkStack &S)
{
    while (S.top != S.base)
    {
        SNode *p = S.top->next;
        free(S.top);
        S.top = p;
    }
    free(S.top);
    S.top = NULL;
}

// 清空
bool ClearStack(LinkStack &S)
{
    while (S.top != S.base)
    {
        SNode *p = S.top->next;
        free(S.top);
        S.top = p;
    }
    S.length = 0;
    return true;
}

// 判空
bool StackEmpty(LinkStack S)
{
    return S.top == S.base;
}

// 长度
int StackLength(LinkStack S)
{
    return S.length;
}

// 获取栈顶元素
bool GetTop(LinkStack S, int &e)
{
    if (S.top == S.base)
        return false;
    e = S.top->next->data;
    return true;
}

// 压栈
bool Push(LinkStack &S, int e)
{
    S.top->data = e;
    SNode *p = (SNode *)malloc(sizeof(SNode));
    p->next = S.top;
    S.top = p;
    S.length++;
    return true;
}

// 出栈
bool Pop(LinkStack &S, int &e)
{
    if (S.top == S.base)
        return false;
    e = S.top->next->data;
    SNode *p = S.top->next;
    S.top->next = p->next;
    if (S.base == p)
        S.base = S.top;
    free(p);
    return true;
}

// 打印
void Print(LinkStack S)
{
    printf("\n-----栈顶-----\n");
    SNode *p = S.top;
    while (p != S.base)
    {
        printf("%d \n", p->next->data);
        p = p->next;
    }
    printf("-----栈底-----\n\n");
}